package com.gem.day07;

import com.gem.day06.extend2.*;

/**
 * 本类用来演示Java多态特性
 * 多态表示多种状态,它的表现:
 * 1.对象的编译时类型写成父类
 * 		Shape rect = new Rect();
 * 		注意: 
 * 		对象编译时类型决定了该对象可以访问的成员,
 * 		如果子类中对父类该成员方法进行了重写,则实际上调用的是子类的方法
 * 
 * 2.方法的参数列表写成父类
 *    好处:该方法就可以接受该父类类型以及它所有的子类类型,大大简化方法的设计
 * 
 * 3.方法的返回类型写成父类
 *   好处:该方法就可以返回任意该父类的子类类型,大大简化方法的设计
 * 
 * @author easonsy
 * 2020年7月24日 上午10:50:47
 */
public class ShapeTest {
	public static void main(String[] args) {
		ShapeService service = new ShapeService();

		Shape rect = new Rect(3, 4);

		/*
		 * 注意:
		 * 此处对象如果向上转型成父类类型,则该对象的特有属性方法就不能访问了,
		 * 而特有属性方法又不合适写在父类中,
		 * 所以,我们要先判断该对象的真正类型,然后再强制类型转换,
		 * 如果不判断直接强转,则可能抛出类型转换异常:
		 * java.lang.ClassCastException
		 * 
		 */
		//判断对象真正类型
		if (rect instanceof Rect) {
			Rect newRect = (Rect) rect;
			System.out.println(newRect.getL());
			System.out.println(newRect.getW());
		}

		service.calcLength(rect);
		service.calcArea(rect);

		Shape circle = new Circle(3.0);
		if (circle instanceof Circle) {
			Circle newCircle = (Circle) circle;
			System.out.println(newCircle.getRadius());
		}
		service.calcLength(circle);
		service.calcArea(circle);

		Shape square = new Square(3);
		service.calcLength(square);
		service.calcArea(square);
	}
}
